REMEBER: Once we know how we are doing the conversion from duration to distance, or what we are doing with it, reset this branch to the remote one and check everthing is as was. Then make the edits in the dev branch, merge the relevent bits in properly and then redo the analysis, remaking the figures for the code. You MUST reset this to remote to prevent overwiting graphs and what not.

This document contains code to fit the waggle dance model to each of our 20 different sites. The code here uses the wagglefit package, as well as some additional code stored in fit_data.R to help simplify things. Each site has its own section, with reused code. The final sections create map plots and summary statistic plots.

Optimising each site

In this document I have fit the collective and individual model to each site. So al the sites have reasonable likelihood values, however in some cases the fits are simply wrong (i.e. they show the probability of sampling a value greater than on equal to \(x\) as increasing in the tail). I need to trouble shoot these with Vincent. I also need to get some advice on how to plot the model fits to the histogram of data.

Would be a good idea to knit this as a single document / run in R studio on the laptop.


calc_dist_actual <- function(duration) {
  m = 1.38
  b = 0. #0.17
  distance = (duration-b) / m
  # distance = (1/m)*duration-(b/m)
  return(distance)
}

data <- read.csv("data/FullHBForagingData.csv")

head(data)

data$newforaging_distance <- calc_dist_actual(data$duration.seconds)

head(data)

par(mfrow = c(2, 2))
hist(data$duration.seconds)
hist(data$ForagingDistance_km)
hist(data$newforaging_distance)

min(data$newforaging_distance)
#> [1] 0.08695652
min(data$duration.seconds)
#> [1] 0.12

alldata <- data %>%
  select(date, site, duration.seconds) %>%
  rename(foraging_distance = duration.seconds)

head(alldata)

BEL

Provides a good fit on the data. All parameters look central and nicely covered.


target_site <- "BEL"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 1.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 0.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 8, -5.5, -1.8)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
BEL collective -181.4148 0.6475794 7.041853 0.8144976 0.0514862 0.1698127 5 372.8296 0.0980392 0.660
BEL individual -183.5011 1.0000000 4.495285 NA 0.0725148 NA 2 371.0021 0.0882353 0.796

all_sites[[target_site]]$fit

BFI

All parameters look central in the likelihood space and a nice fit is returned.


target_site <- "BFI"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 0.6)
bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.2, 3.5, -6.5, -2.)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
BFI collective -190.4988 0.0444148 0.000001 2.790595 0.1641431 0.2480702 5 390.9976 0.0873362 0.362
BFI individual -211.2967 1.0000000 9.470271 NA 0.1000000 NA 2 426.5934 0.1834061 0.002

all_sites[[target_site]]$fit

BLO

The individual fit isnt great and the Bs paramater is increasing up to the boundry, indicating it can only really take on a straight line / exponential fit. The parameters for the collective model are fairly central in the likelihood space, the fit looks very good.


target_site <- "BLO"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-10, 5)
br_bnds <- c(1.0e-10, 5)
as_bnds <- c(1.0e-5, 5)
ar_bnds <- c(1.0e-10, 1.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 5505)
as_bnds <- c(1.0e-12, 0.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.2, 9.5, -8., -2.2)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
BLO collective -221.0260 0.2085372 1.785832 0.570999 0.0677377 0.3591282 5 452.0519 0.0705882 0.759
BLO individual -237.3888 1.0000000 5505.000000 NA 0.0001222 NA 2 478.7776 0.1117647 0.222

all_sites[[target_site]]$fit

BUR

Bs and Br go in oposite directions. E.g. Bs approaches 0 whilst Br approaches an every higher number.

Fit looks good.


target_site <- "BUR"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 500)
br_bnds <- c(1.0e-6, 500)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 1.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 0.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 4, -6.5, -2.2)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
BUR collective -118.3047 0.1112185 1e-06 500 0.1510718 0.0274822 5 246.6094 0.0670732 0.813
BUR individual -143.7177 1.0000000 1e+01 NA 0.1000000 NA 2 291.4355 0.1768293 0.015

all_sites[[target_site]]$fit

CAD

The collective model roughly follows the individual model but is able to acheive a slightly improved fit to the shoulder, hence it provides a higher likelihood score. The AIC indicates this is overfitting, suggesting the individual model provides a more parsimonious explanation.

\(p\) does not approach 1 as one might expect, indicating there is overfitting and so a comparison with an individual model is required.


target_site <- "CAD"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 10)
ar_bnds <- c(1.0e-12, 10)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 2)
as_bnds <- c(1.0e-12, 0.8)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 1.8, -6, -1.2)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
CAD collective -48.27862 0.1651682 1e-06 0.4178487 1.458751 0.3862391 5 106.5572 0.0821918 0.961
CAD individual -49.95312 1.0000000 1e-06 NA 0.385461 NA 2 103.9062 0.1095890 0.751

all_sites[[target_site]]$fit

GIL

The collective model provides the most parsimonious and best fit.


target_site <- "GIL"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 1.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 0.8)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 2.1, -8., -2)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
GIL collective -74.54156 0.2604975 0.000001 3.22e-05 0.3344613 0.7543989 5 159.0831 0.1354167 0.064
GIL individual -102.30919 1.0000000 2.036505 NA 0.3450190 NA 2 208.6184 0.1979167 0.000

all_sites[[target_site]]$fit

HER

The collective model provides the best fit to the data, but the proportion of scouts is high.


target_site <- "HER"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 100)
br_bnds <- c(1.0e-6, 100)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 1.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 2)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 4, -6.5, -1.5)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
HER collective -235.1821 0.6369317 0.0000010 1e-06 0.1771152 0.4289843 5 480.3642 0.1104651 0.223
HER individual -242.3219 1.0000000 0.5484174 NA 0.1826291 NA 2 488.6438 0.1395349 0.062

all_sites[[target_site]]$fit

HHS

Collective model provides the best fit but falls under the tail and shoulder. The individual model strugles to find a good fit, probably due to the tail.


target_site <- "HHS"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 50)
br_bnds <- c(1.0e-6, 50)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 1.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 4, -6.5, -2.2)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
HHS collective -61.34802 0.09527 0.000001 1e-06 0.1410171 0.5030082 5 132.6960 0.1333333 0.367
HHS individual -83.74915 1.00000 7.095173 NA 0.1251512 NA 2 171.4983 0.2444444 0.011

all_sites[[target_site]]$fit

HOR

Collective model provides a very good fit, whilst the individual model fails to find much traction. The proportion of scouts goes very low (~3%) suggesting the majority of the colony are following a small number of scouting individuals.


target_site <- "HOR"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 1.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 3, -9, -2.5)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
HOR collective -146.0403 0.0225121 0.000001 10 0.2132816 0.2025719 5 302.0806 0.0659898 0.35
HOR individual -213.5839 1.0000000 4.342541 NA 0.2547302 NA 2 431.1677 0.1852792 0.00

all_sites[[target_site]]$fit

MAK

Again the collective model provides a good fit to the data, however, the individual model fits poorly, reducing to an exponential.


target_site <- "MAK"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 20)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# run individual model
individual_result <- fit_individual_model_to_data(data, bounds)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

# view individual model likelihood space to check bounds look ok
individual_result$llspace


# set coordinates for histogram subplot
subplot_coords <- c(0.1, 4.2, -6.5, -2.5)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
MAK collective -84.51875 0.2093454 2.319365 0.0201563 0.1221729 0.4776196 5 179.0375 0.0909091 0.773
MAK individual -98.02457 1.0000000 9.168368 NA 0.0961026 NA 2 200.0491 0.1919192 0.037

all_sites[[target_site]]$fit

MEL

Collective model provides the best fit, however it misses a large section of the shoulder for the tail. The \(bs\) parameter wants to go to zero, however when let go bellow 1e-6 the behaviour becomes very erratic and the fit deteriorates.


target_site <- "MEL"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 3., -7, -2.1)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
MEL collective -115.3163 0.0802699 1e-06 1e-06 0.2130415 0.3377061 5 240.6326 0.1626016 0.067
MEL individual -135.7308 1.0000000 1e-06 NA 0.2520814 NA 2 275.4617 0.2439024 0.002

all_sites[[target_site]]$fit

MPA

Collective provides the best fit.


target_site <- "MPA"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 4., -7.2, -2.1)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
MPA collective -181.8729 0.5669654 0.5783844 1e-06 0.1853644 0.419992 5 373.7458 0.0666667 0.885
MPA individual -188.0378 1.0000000 1.4738536 NA 0.1866656 NA 2 380.0756 0.1000000 0.436

all_sites[[target_site]]$fit

ROT

Colletive provides the best fit.


target_site <- "ROT"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 2., -5.5, -2.1)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
ROT collective -138.1293 0.3069839 1e-06 1e-06 0.3149554 0.483051 5 286.2586 0.1494845 0.029
ROT individual -153.3550 1.0000000 1e-06 NA 0.3538091 NA 2 310.7100 0.2010309 0.001

all_sites[[target_site]]$fit

SAU

Collective provides the best fit.


target_site <- "SAU"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 2.5, -6.5, -2.1)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
SAU collective -108.1852 0.3097081 0.000001 10 0.2622540 0.1634871 5 226.3703 0.0606061 0.958
SAU individual -115.5025 1.0000000 1.488528 NA 0.2710389 NA 2 235.0051 0.1287879 0.194

all_sites[[target_site]]$fit

SOM

Collective provides the best fit but misses a large section of the shoulder.


target_site <- "SOM"

# subset data for target site
data <- alldata %>%
  filter(site == target_site) %>%
  filter(foraging_distance < 6) # remove outlier distance

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 2., -5.5, -2.1)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
SOM collective -70.53597 0.0020792 1e+01 10 1.5000000 0.1486462 5 151.0719 0.1071429 0.489
SOM individual -76.67133 1.0000000 1e-06 NA 0.3772213 NA 2 157.3427 0.1607143 0.100

all_sites[[target_site]]$fit

SRA

Collective provides the best fit.


target_site <- "SRA"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 3., -7.5, -2.1)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
SRA collective -123.3686 0.2408946 0.000001 0.2074252 0.2128828 0.492098 5 256.7372 0.0519481 0.981
SRA individual -138.1142 1.0000000 3.002015 NA 0.2133652 NA 2 280.2284 0.1428571 0.080

all_sites[[target_site]]$fit

STU

Individual provides the best fit. Again, the proportion of scouts does not move towards 1. I.e. the collective model fails to reduce to the individual in the MLE fit.


target_site <- "STU"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 4, -6.5, -1.5)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
STU collective -155.7046 0.3480603 0.000001 1.035927 0.5209567 0.1562773 5 321.4092 0.0454545 0.998
STU individual -156.5403 1.0000000 1.346564 NA 0.1612383 NA 2 317.0806 0.0545455 0.993

all_sites[[target_site]]$fit

SWP

Collective provides the best fit.


target_site <- "SWP"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 15)
br_bnds <- c(1.0e-6, 15)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 2., -6, -1.5)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
SWP collective -40.42382 0 1.700894 1.274713 0.1920584 0.3841755 5 90.84765 0.1000000 0.740
SWP individual -46.44077 1 0.000001 NA 0.4236580 NA 2 96.88153 0.1444444 0.256

all_sites[[target_site]]$fit

YAL

Collective provides the best fit.


target_site <- "YAL"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.1)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 4., -8, -2.)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
YAL collective -256.2179 0.1526265 0.9940552 0.2527174 0.1890417 0.2865297 5 522.4357 0.0646552 0.682
YAL individual -274.0674 1.0000000 0.5900944 NA 0.2131332 NA 2 552.1348 0.0948276 0.231

all_sites[[target_site]]$fit

ZSL

Collective provides the best fit.


target_site <- "ZSL"

# subset data for target site
data <- alldata %>%
  filter(site == target_site)

# set up bounds for the collective model
p_bnds <- c(0, 1.0)
bs_bnds <- c(1.0e-6, 10)
br_bnds <- c(1.0e-6, 10)
as_bnds <- c(1.0e-12, 1.5)
ar_bnds <- c(1.0e-12, 0.5)
collective_bounds <- rbind(
  p_bnds, bs_bnds,
  br_bnds, as_bnds,
  ar_bnds
)

# set up bounds for the individual model
bs_bnds <- c(1.0e-6, 50)
as_bnds <- c(1.0e-12, 1.3)
individual_bounds <- rbind(
  bs_bnds, as_bnds
)

# set coordinates for histogram subplot
subplot_coords <- c(0.1, 1.8, -8, -2)

all_sites[[target_site]] <- run_wagglefit_analysis(
  target_site, data, collective_bounds, individual_bounds, subplot_coords
)
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"
#> [1] "Itteration 1"
#> [1] "Itteration 2"
#> [1] "Itteration 3"
#> [1] "Itteration 4"
#> [1] "Itteration 5"
#> [1] "Itteration 6"
#> [1] "Itteration 7"
#> [1] "Itteration 8"
#> [1] "Itteration 9"
#> [1] "Itteration 10"

all_sites[[target_site]]$fit_result %>%
  kbl() %>%
  kable_classic(full_width = F)
site model loglikelihood p bs br as ar k AIC ks_statistic ks_pvalue
ZSL collective -150.2733 0.0529216 0.0000010 9.995042 0.3735478 0.1997564 5 310.5467 0.0481013 0.72
ZSL individual -181.7338 1.0000000 0.9650966 NA 0.4235067 NA 2 367.4675 0.1215190 0.01

all_sites[[target_site]]$fit

Overall findings


# group all site results together
df <- map(all_sites, 1) %>%
  bind_rows()

# save results
saveRDS(df, file = "results/site_fit_results.Rda")

# AIC plot
aic_plot <- df %>%
  group_by(site) %>%
  slice(which.min(AIC)) %>%
  select(model) %>%
  group_by(model) %>%
  summarise(lowest_AIC = n()) %>%
  ggplot(aes(x = model, y = lowest_AIC)) +
  geom_bar(stat = "identity") +
  labs(x = "Model", y = "Count") +
  scale_y_continuous(breaks = seq(0, 20, by = 2)) +
  theme(
    text = element_text(size = 42)
  )

ggsave(
  plot = aic_plot,
  filename = "results/figures/AIC_plot.png",
  width = 90,
  height = 110,
  units = "mm",
  dpi = 300
)

# ks plot
ks_plot_dist <- df %>%
  ggplot(aes(x = ks_pvalue)) +
  geom_histogram(bins = 10, binwidth = 0.1, col = "white") +
  geom_vline(xintercept = 0.05, color = "red", linetype = "dashed") +
  scale_y_continuous(breaks = seq(0, 12, by = 2)) +
  labs(x = "KS P value") +
  facet_wrap(~model, nrow = 3) +
  theme(
    text = element_text(size = 42),
    strip.background = element_blank()
  )


ggsave(
  plot = ks_plot_dist,
  filename = "results/figures/sites_ks.png",
  width = 86,
  height = 180,
  units = "mm",
  dpi = 300
)

ggsave(
  plot = all_sites$STU$fit,
  filename = "results/figures/STU.png",
  width = 90,
  height = 110,
  units = "mm",
  dpi = 300
)

ggsave(
  plot = all_sites$ZSL$fit,
  filename = "results/figures/ZSL.png",
  width = 90,
  height = 110,
  units = "mm",
  dpi = 300
)

Map plots

Code to make the individual mal plots. These figures are created standalone but are combined in to facets manually in an image processor.


library(ggplot2)
library(ggrepel)
library(gridExtra)
library(ggsn)
library(sf)
library(rworldmap)
library(ggspatial)
library(rnaturalearth)
library(rnaturalearthdata)


full_data_path <- "data/FullHBForagingData.csv"
data_raw <- tibble(read.csv(full_data_path))

map_data <- data_raw %>%
  select(
    site, lat, lon
  ) %>%
  distinct()

map_data <- df %>%
  group_by(site) %>%
  slice(which.min(AIC)) %>%
  select(site, model) %>%
  left_join(map_data, on = "site") %>%
  mutate(col = ifelse(site %in% c("STU", "ZSL"), "1", "0"))

locations <- st_as_sf(
  map_data,
  coords = c("lon", "lat"), crs = 4326
)

# Extract selected sites for figure
selected_sites <- filter(map_data, site %in% c("STU", "ZSL")) %>%
  mutate(
    label = ifelse(site == "STU", "C (STU)", "D (ZSL)")
  )

points_area <- st_bbox(locations)

worldmap <- ne_countries(scale = "large", returnclass = "sf")

# london area
london <- st_read(
  "shapefiles/London_Ward.shp"
)
#> Reading layer `London_Ward' from data source 
#>   `/home/joe/Documents/PhD/wagglefit/analysis/shapefiles/London_Ward.shp' 
#>   using driver `ESRI Shapefile'
#> Simple feature collection with 649 features and 0 fields
#> Geometry type: POLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 503568.2 ymin: 155850.8 xmax: 561957.5 ymax: 200933.9
#> Projected CRS: OSGB 1936 / British National Grid

london <- st_transform(
  london,
  CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")
)

inset <- ggplot() +
  geom_sf(
    data = worldmap,
    fill = "grey90",
    color = "#4b4949d0"
  ) +
  geom_sf(
    data = london,
    fill = "#ced0cffc",
    lwd = 0
  ) +
  coord_sf(
    xlim = c(points_area[[1]] - 0.1, points_area[[3]] + 0.1),
    ylim = c(points_area[[2]] - 0.1, points_area[[4]] + 0.1)
  ) +
  geom_point(
    data = map_data,
    aes(x = lon, y = lat, shape = model, colour = model), size = 1.5
  ) +
  geom_text(
    data = selected_sites, aes(x = lon, y = lat, label = label),
    nudge_x = c(0, -0.07), nudge_y = c(0.05, 0.05), size = 8
  ) +
  annotation_north_arrow(
    location = "tr", which_north = "true",
    style = north_arrow_fancy_orienteering,
    height = unit(15, "mm"),
    width = unit(15, "mm"),
    text_cex = 1.5
  ) +
  annotation_scale(
    location = "br",
    text_cex = 1.5
  ) +
  scale_shape_manual(values = c(1, 2)) +
  scale_colour_manual(values = c("black", "red")) +
  theme_nothing() +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  labs(x = NULL, y = NULL) +
  theme(
    panel.border = element_rect(color = "black", fill = NA, size = .5)
  )

inset


# make full plot
base <- ggplot(data = worldmap) +
  geom_sf(
    fill = "#c4cfc8",
    color = "#4b4949d0",
    lwd = 0.2
  ) +
  coord_sf(
    xlim = c(-11, 3),
    ylim = c(49.5, 60)
  ) +
  # geom_point(data = map_data, aes(x = lon, y = lat), size = 0.2) +
  geom_rect(
    aes(
      xmin = points_area$xmin[[1]] - 0.1, xmax = points_area$xmax[[1]] + 0.1,
      ymin = points_area$ymin[[1]] - 0.1, ymax = points_area$ymax[[1]] + 0.1
    ),
    fill = NA,
    colour = "black",
    size = .02
  ) +
  theme_nothing() +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  labs(x = NULL, y = NULL) +
  theme(
    panel.border = element_rect(color = "black", fill = NA, size = .5)
  )

base


merge_plot <- base +
  annotation_custom(
    ggplotGrob(inset),
    xmin = 1,
    xmax = 13,
    ymin = 52.5,
    ymax = 60
  )

merge_plot


ggsave(
  plot = merge_plot,
  filename = "results/figures/site_map.png",
  width = 90,
  height = 110,
  units = "mm",
  dpi = 300
)


merge_plot_2 <- inset +
  annotation_custom(
    ggplotGrob(base),
    xmin = -3.35,
    xmax = 2,
    ymin = 51.05,
    ymax = 51.35
  )

merge_plot_2


sites_model_plot <- plot_grid(
  merge_plot_2, ks_plot_dist, all_sites$STU$fit, all_sites$ZSL$fit,
  labels = c("A", "B", "C", "D"), label_size = 24
)

ggsave(
  plot = sites_model_plot,
  filename = "results/figures/sites_model_plot.png",
  width = 183,
  height = 190,
  units = "mm",
  dpi = 300
)

model_sites_fits <- plot_grid(
  merge_plot_2, ks_plot_dist,
  labels = c("A", "B"), label_size = 24
)

ggsave(
  plot = model_sites_fits,
  filename = "results/figures/model_sites_fits.png",
  width = 183,
  height = 190,
  units = "mm",
  dpi = 300
)

stu_zsl_fit <- plot_grid(
  all_sites$STU$fit, all_sites$ZSL$fit,
  labels = c("A", "B"), label_size = 24
)

ggsave(
  plot = stu_zsl_fit,
  filename = "results/figures/stu_zsl_fit.svg",
  width = 183,
  height = 190,
  units = "mm",
  dpi = 100
)
# other map plots
inset <- ggplot() +
  geom_sf(
    data = worldmap,
    fill = "grey90",
    color = "#4b4949d0"
  ) +
  geom_sf(
    data = london,
    fill = "#ced0cffc",
    lwd = 0
  ) +
  coord_sf(
    xlim = c(points_area[[1]] - 0.1, points_area[[3]] + 0.1),
    ylim = c(points_area[[2]] - 0.1, points_area[[4]] + 0.1)
  ) +
  geom_point(
    data = map_data,
    aes(x = lon, y = lat, shape = model, colour = model), size = 1.5
  ) +
  annotation_north_arrow(
    location = "tr", which_north = "true",
    style = north_arrow_fancy_orienteering,
    height = unit(10, "mm"),
    width = unit(10, "mm")
  ) +
  annotation_scale(
    location = "br",
    text_cex = 3
  ) +
  scale_shape_manual(values = c(1, 2)) +
  scale_colour_manual(values = c("black", "red")) +
  theme_nothing() +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  labs(x = NULL, y = NULL) +
  theme(
    panel.border = element_rect(color = "black", fill = NA, size = .5),
    text = element_text(size = 42)
  )

inset

# make full plot
base <- ggplot(data = worldmap) +
  geom_sf(
    fill = "#c4cfc8",
    color = "#4b4949d0",
    lwd = 0.2
  ) +
  coord_sf(
    xlim = c(-11, 15),
    ylim = c(49.5, 60)
  ) +
  geom_point(data = map_data, aes(x = lon, y = lat), size = 0.2) +
  geom_rect(
    aes(
      xmin = points_area$xmin[[1]] - 0.1, xmax = points_area$xmax[[1]] + 0.1,
      ymin = points_area$ymin[[1]] - 0.1, ymax = points_area$ymax[[1]] + 0.1
    ),
    fill = NA,
    colour = "black",
    size = .02
  ) +
  theme_nothing() +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  labs(x = NULL, y = NULL) +
  theme(
    panel.border = element_rect(color = "black", fill = NA, size = .5)
  )

merge_plot <- base +
  annotation_custom(
    ggplotGrob(inset),
    xmin = 1,
    xmax = 13,
    ymin = 52.5,
    ymax = 60
  )

merge_plot

ggsave(
  plot = merge_plot,
  filename = "results/figures/site_map.png",
  width = 183,
  height = 190,
  units = "mm",
  dpi = 300
)


sites_model_plot <- plot_grid(
  all_sites$STU$fit, all_sites$ZSL$fit, aic_plot, ks_plot_dist,
  labels = c("A", "B", "C", "D"), label_size = 42
)

sites_model_plot

ggsave(
  plot = sites_model_plot,
  filename = "results/figures/results_model_plot.png",
  width = 183,
  height = 190,
  units = "mm",
  dpi = 300
)
LS0tCnRpdGxlOiBGaXR0aW5nIHdhZ2dsZSBkYW5jZSBtb2RlbHMgdG8gd2FnZ2xlIGRhbmNlIGRhdGEKYXV0aG9yOiBKb3NlcGggUGFsbWVyCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IHlldGkKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKUkVNRUJFUjogT25jZSB3ZSBrbm93IGhvdyB3ZSBhcmUgZG9pbmcgdGhlIGNvbnZlcnNpb24gZnJvbSBkdXJhdGlvbiB0byBkaXN0YW5jZSwgb3Igd2hhdCB3ZSBhcmUgZG9pbmcgd2l0aCBpdCwgcmVzZXQgdGhpcyBicmFuY2ggdG8gdGhlIHJlbW90ZSBvbmUgYW5kIGNoZWNrIGV2ZXJ0aGluZyBpcyBhcyB3YXMuIFRoZW4gbWFrZSB0aGUgZWRpdHMgaW4gdGhlIGRldiBicmFuY2gsIG1lcmdlIHRoZSByZWxldmVudCBiaXRzIGluIHByb3Blcmx5IGFuZCB0aGVuIHJlZG8gdGhlIGFuYWx5c2lzLCByZW1ha2luZyB0aGUgZmlndXJlcyBmb3IgdGhlIGNvZGUuIFlvdSBNVVNUIHJlc2V0IHRoaXMgdG8gcmVtb3RlIHRvIHByZXZlbnQgb3ZlcndpdGluZyBncmFwaHMgYW5kIHdoYXQgbm90LgoKVGhpcyBkb2N1bWVudCBjb250YWlucyBjb2RlIHRvIGZpdCB0aGUgd2FnZ2xlIGRhbmNlIG1vZGVsIHRvIGVhY2ggb2Ygb3VyIDIwIGRpZmZlcmVudCBzaXRlcy4gVGhlIGNvZGUgaGVyZSB1c2VzIHRoZSB3YWdnbGVmaXQgcGFja2FnZSwgYXMgd2VsbCBhcyBzb21lIGFkZGl0aW9uYWwgY29kZSBzdG9yZWQgaW4gYGZpdF9kYXRhLlJgIHRvIGhlbHAgc2ltcGxpZnkgdGhpbmdzLiBFYWNoIHNpdGUgaGFzIGl0cyBvd24gc2VjdGlvbiwgd2l0aCByZXVzZWQgY29kZS4gVGhlIGZpbmFsIHNlY3Rpb25zIGNyZWF0ZSBtYXAgcGxvdHMgYW5kIHN1bW1hcnkgc3RhdGlzdGljIHBsb3RzLgoKYGBge3IsIHByZWFtYmxlLCBpbmNsdWRlID0gRkFMU0V9CmRldnRvb2xzOjpsb2FkX2FsbCgpCgprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgY29sbGFwc2UgPSBUUlVFLAogIGNvbW1lbnQgPSAiIz4iLAogIGZpZy5wYXRoID0gIm1hbi9maWd1cmVzL1JFQURNRS0iLAogIG91dC53aWR0aCA9ICIxMDAlIgopCmxpYnJhcnkoZ2dwbG90MikKdGhlbWVfc2V0KAogIHRoZW1lX2NsYXNzaWMoKSArCiAgICB0aGVtZSgKICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiRGVqYVZ1U2VyaWYiLCBzaXplID0gNDgpCiAgICApCikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpYmJsZSkKc291cmNlKCJmaXRfZGF0YS5SIikKbGlicmFyeShrYWJsZUV4dHJhKQoKbGlicmFyeShzaG93dGV4dCkKc2hvd3RleHRfYXV0bygpCgpydW5fd2FnZ2xlZml0X2FuYWx5c2lzIDwtIGZ1bmN0aW9uKHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzKSB7CgogICMgcnVuIGNvbGxlY3RpdmUgbW9kZWwKICBjb2xsZXRpdmVfcmVzdWx0IDwtIGZpdF9jb2xsZWN0aXZlX21vZGVsX3RvX2RhdGEoZGF0YSwgY29sbGVjdGl2ZV9ib3VuZHMpCgogICMgcnVuIGluZGl2aWR1YWwgbW9kZWwKICBpbmRpdmlkdWFsX3Jlc3VsdCA8LSBmaXRfaW5kaXZpZHVhbF9tb2RlbF90b19kYXRhKGRhdGEsIGluZGl2aWR1YWxfYm91bmRzKQoKICAjIG1ha2UgcGxvdCBvZiBtb2RlbCBmaXRzCiAgZnVsbF9wbG90IDwtIG1ha2VfZnVsbF9wbG90KAogICAgZGF0YSRmb3JhZ2luZ19kaXN0YW5jZSwKICAgIGxpc3QoCiAgICAgICJjb2xsZWN0aXZlIiA9IGNvbGxldGl2ZV9yZXN1bHQkc29sdXRpb24sCiAgICAgICJpbmRpdmlkdWFsIiA9IGluZGl2aWR1YWxfcmVzdWx0JHNvbHV0aW9uCiAgICApLAogICAgc3VicGxvdF9jb29yZHMgPSBzdWJwbG90X2Nvb3JkcwogICkKCiAgIyBjYWxjdWxhdGUga3Mgc3RhdGlzdGljcwogIGtzX3Rlc3RfcmVzdWx0X2NvbGxlY3RpdmUgPC0gY2FsY19rc19ib290KAogICAgZGF0YSRmb3JhZ2luZ19kaXN0YW5jZSwgY29sbGV0aXZlX3Jlc3VsdCRzb2x1dGlvbiRlc3QsICJjb2xsZWN0aXZlIgogICkKICBrc190ZXN0X3Jlc3VsdF9pbmRpdmlkdWFsIDwtIGNhbGNfa3NfYm9vdCgKICAgIGRhdGEkZm9yYWdpbmdfZGlzdGFuY2UsIGluZGl2aWR1YWxfcmVzdWx0JHNvbHV0aW9uJGVzdCwgImluZGl2aWR1YWwiCiAgKQoKICAjIGJyaW5nIHJlc3VsdHMgdG9nZXRoZXIKICBtb2RlbF9maXRzIDwtIHRpYmJsZSgKICAgIHNpdGUgPSBjKHRhcmdldF9zaXRlLCB0YXJnZXRfc2l0ZSksCiAgICBtb2RlbCA9IGMoImNvbGxlY3RpdmUiLCAiaW5kaXZpZHVhbCIpLAogICAgbG9nbGlrZWxpaG9vZCA9IGMoCiAgICAgIGNvbGxldGl2ZV9yZXN1bHQkc29sdXRpb24kZm1heCwgaW5kaXZpZHVhbF9yZXN1bHQkc29sdXRpb24kZm1heAogICAgKSwKICAgIHAgPSBjKGNvbGxldGl2ZV9yZXN1bHQkc29sdXRpb24kZXN0WzFdLCAxKSwKICAgIGJzID0gYyhjb2xsZXRpdmVfcmVzdWx0JHNvbHV0aW9uJGVzdFsyXSwgaW5kaXZpZHVhbF9yZXN1bHQkc29sdXRpb24kZXN0WzFdKSwKICAgIGJyID0gYyhjb2xsZXRpdmVfcmVzdWx0JHNvbHV0aW9uJGVzdFszXSwgTkEpLAogICAgYXMgPSBjKGNvbGxldGl2ZV9yZXN1bHQkc29sdXRpb24kZXN0WzRdLCBpbmRpdmlkdWFsX3Jlc3VsdCRzb2x1dGlvbiRlc3RbMl0pLAogICAgYXIgPSBjKGNvbGxldGl2ZV9yZXN1bHQkc29sdXRpb24kZXN0WzVdLCBOQSksCiAgICBrID0gYygKICAgICAgbGVuZ3RoKGNvbGxldGl2ZV9yZXN1bHQkc29sdXRpb24kZXN0KSwKICAgICAgbGVuZ3RoKGluZGl2aWR1YWxfcmVzdWx0JHNvbHV0aW9uJGVzdCkKICAgICksCiAgICBBSUMgPSBjKAogICAgICBjYWxjX2FpYygKICAgICAgICBsZW5ndGgoY29sbGV0aXZlX3Jlc3VsdCRzb2x1dGlvbiRlc3QpLCBjb2xsZXRpdmVfcmVzdWx0JHNvbHV0aW9uJGZtYXgKICAgICAgKSwKICAgICAgY2FsY19haWMoCiAgICAgICAgbGVuZ3RoKGluZGl2aWR1YWxfcmVzdWx0JHNvbHV0aW9uJGVzdCksIGluZGl2aWR1YWxfcmVzdWx0JHNvbHV0aW9uJGZtYXgKICAgICAgKQogICAgKSwKICAgIGtzX3N0YXRpc3RpYyA9IGMoCiAgICAgIGtzX3Rlc3RfcmVzdWx0X2NvbGxlY3RpdmUka3Mkc3RhdGlzdGljW1sxXV0sCiAgICAgIGtzX3Rlc3RfcmVzdWx0X2luZGl2aWR1YWwka3Mkc3RhdGlzdGljW1sxXV0KICAgICksCiAgICBrc19wdmFsdWUgPSBjKAogICAgICBrc190ZXN0X3Jlc3VsdF9jb2xsZWN0aXZlJGtzLmJvb3QucHZhbHVlLAogICAgICBrc190ZXN0X3Jlc3VsdF9pbmRpdmlkdWFsJGtzLmJvb3QucHZhbHVlCiAgICApCiAgKQoKICByZXR1cm4oCiAgICBsaXN0KAogICAgICBmaXRfcmVzdWx0ID0gbW9kZWxfZml0cywgZml0ID0gZnVsbF9wbG90LAogICAgICBpbmRpdmlkdWFsX2xsc3BhY2UgPSBpbmRpdmlkdWFsX3Jlc3VsdCRsbHNwYWNlLAogICAgICBjb2xsZWN0aXZlX2xsc3BhY2UgPSBjb2xsZXRpdmVfcmVzdWx0JGxsc3BhY2UKICAgICkKICApCn0KCmFsbF9zaXRlcyA8LSBhcy5saXN0KHJlcCgwLCAyMCkpCm5hbWVzKGFsbF9zaXRlcykgPC0gZ2V0X2RhdGEoKSAlPiUKICBzZWxlY3Qoc2l0ZSkgJT4lCiAgdW5pcXVlKCkgJT4lCiAgcHVsbCgpCmBgYAoKIyMgT3B0aW1pc2luZyBlYWNoIHNpdGUKCkluIHRoaXMgZG9jdW1lbnQgSSBoYXZlIGZpdCB0aGUgY29sbGVjdGl2ZSBhbmQgaW5kaXZpZHVhbCBtb2RlbCB0byBlYWNoIHNpdGUuIFNvIGFsIHRoZSBzaXRlcyBoYXZlIHJlYXNvbmFibGUgbGlrZWxpaG9vZCB2YWx1ZXMsIGhvd2V2ZXIgaW4gc29tZSBjYXNlcyB0aGUgZml0cyBhcmUgc2ltcGx5IHdyb25nIChpLmUuIHRoZXkgc2hvdyB0aGUgcHJvYmFiaWxpdHkgb2Ygc2FtcGxpbmcgYSB2YWx1ZSBncmVhdGVyIHRoYW4gb24gZXF1YWwgdG8gJHgkIGFzIGluY3JlYXNpbmcgaW4gdGhlIHRhaWwpLiBJIG5lZWQgdG8gdHJvdWJsZSBzaG9vdCB0aGVzZSB3aXRoIFZpbmNlbnQuIEkgYWxzbyBuZWVkIHRvIGdldCBzb21lIGFkdmljZSBvbiBob3cgdG8gcGxvdCB0aGUgbW9kZWwgZml0cyB0byB0aGUgaGlzdG9ncmFtIG9mIGRhdGEuCgpXb3VsZCBiZSBhIGdvb2QgaWRlYSB0byBrbml0IHRoaXMgYXMgYSBzaW5nbGUgZG9jdW1lbnQgLyBydW4gaW4gUiBzdHVkaW8gb24gdGhlIGxhcHRvcC4KCgpgYGB7cn0KCmNhbGNfZGlzdF9hY3R1YWwgPC0gZnVuY3Rpb24oZHVyYXRpb24pIHsKICBtID0gMS4zOAogIGIgPSAwLiAjMC4xNwogIGRpc3RhbmNlID0gKGR1cmF0aW9uLWIpIC8gbQogICMgZGlzdGFuY2UgPSAoMS9tKSpkdXJhdGlvbi0oYi9tKQogIHJldHVybihkaXN0YW5jZSkKfQoKZGF0YSA8LSByZWFkLmNzdigiZGF0YS9GdWxsSEJGb3JhZ2luZ0RhdGEuY3N2IikKCmhlYWQoZGF0YSkKCmRhdGEkbmV3Zm9yYWdpbmdfZGlzdGFuY2UgPC0gY2FsY19kaXN0X2FjdHVhbChkYXRhJGR1cmF0aW9uLnNlY29uZHMpCgpoZWFkKGRhdGEpCgpwYXIobWZyb3cgPSBjKDIsIDIpKQpoaXN0KGRhdGEkZHVyYXRpb24uc2Vjb25kcykKaGlzdChkYXRhJEZvcmFnaW5nRGlzdGFuY2Vfa20pCmhpc3QoZGF0YSRuZXdmb3JhZ2luZ19kaXN0YW5jZSkKCm1pbihkYXRhJG5ld2ZvcmFnaW5nX2Rpc3RhbmNlKQptaW4oZGF0YSRkdXJhdGlvbi5zZWNvbmRzKQoKYWxsZGF0YSA8LSBkYXRhICU+JQogIHNlbGVjdChkYXRlLCBzaXRlLCBkdXJhdGlvbi5zZWNvbmRzKSAlPiUKICByZW5hbWUoZm9yYWdpbmdfZGlzdGFuY2UgPSBkdXJhdGlvbi5zZWNvbmRzKQoKaGVhZChhbGxkYXRhKQoKYGBgCgojIyMgQkVMCgpQcm92aWRlcyBhIGdvb2QgZml0IG9uIHRoZSBkYXRhLiBBbGwgcGFyYW1ldGVycyBsb29rIGNlbnRyYWwgYW5kIG5pY2VseSBjb3ZlcmVkLgoKYGBge3IsIEJFTCwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cgp0YXJnZXRfc2l0ZSA8LSAiQkVMIgoKIyBzdWJzZXQgZGF0YSBmb3IgdGFyZ2V0IHNpdGUKZGF0YSA8LSBhbGxkYXRhICU+JQogIGZpbHRlcihzaXRlID09IHRhcmdldF9zaXRlKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgY29sbGVjdGl2ZSBtb2RlbApwX2JuZHMgPC0gYygwLCAxLjApCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQpicl9ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKYXJfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKY29sbGVjdGl2ZV9ib3VuZHMgPC0gcmJpbmQoCiAgcF9ibmRzLCBic19ibmRzLAogIGJyX2JuZHMsIGFzX2JuZHMsCiAgYXJfYm5kcwopCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBpbmRpdmlkdWFsIG1vZGVsCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMC4xKQppbmRpdmlkdWFsX2JvdW5kcyA8LSByYmluZCgKICBic19ibmRzLCBhc19ibmRzCikKCiMgc2V0IGNvb3JkaW5hdGVzIGZvciBoaXN0b2dyYW0gc3VicGxvdApzdWJwbG90X2Nvb3JkcyA8LSBjKDAuMSwgOCwgLTUuNSwgLTEuOCkKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSA8LSBydW5fd2FnZ2xlZml0X2FuYWx5c2lzKAogIHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzCikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXRfcmVzdWx0ICU+JQogIGtibCgpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0CmBgYAoKCgojIyMgQkZJCgpBbGwgcGFyYW1ldGVycyBsb29rIGNlbnRyYWwgaW4gdGhlIGxpa2VsaWhvb2Qgc3BhY2UgYW5kIGEgbmljZSBmaXQgaXMgcmV0dXJuZWQuCgpgYGB7ciwgQkZJLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnRhcmdldF9zaXRlIDwtICJCRkkiCgojIHN1YnNldCBkYXRhIGZvciB0YXJnZXQgc2l0ZQpkYXRhIDwtIGFsbGRhdGEgJT4lCiAgZmlsdGVyKHNpdGUgPT0gdGFyZ2V0X3NpdGUpCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBjb2xsZWN0aXZlIG1vZGVsCnBfYm5kcyA8LSBjKDAsIDEuMCkKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmJyX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS41KQphcl9ibmRzIDwtIGMoMS4wZS0xMiwgMC41KQpib3VuZHMgPC0gcmJpbmQoCiAgcF9ibmRzLCBic19ibmRzLAogIGJyX2JuZHMsIGFzX2JuZHMsCiAgYXJfYm5kcwopCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBpbmRpdmlkdWFsIG1vZGVsCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMC42KQpib3VuZHMgPC0gcmJpbmQoCiAgYnNfYm5kcywgYXNfYm5kcwopCgojIHNldCBjb29yZGluYXRlcyBmb3IgaGlzdG9ncmFtIHN1YnBsb3QKc3VicGxvdF9jb29yZHMgPC0gYygwLjIsIDMuNSwgLTYuNSwgLTIuKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgoKIyMjIEJMTwoKVGhlIGluZGl2aWR1YWwgZml0IGlzbnQgZ3JlYXQgYW5kIHRoZSBCcyBwYXJhbWF0ZXIgaXMgaW5jcmVhc2luZyB1cCB0byB0aGUgYm91bmRyeSwgaW5kaWNhdGluZyBpdCBjYW4gb25seSByZWFsbHkgdGFrZSBvbiBhIHN0cmFpZ2h0IGxpbmUgLyBleHBvbmVudGlhbCBmaXQuIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29sbGVjdGl2ZSBtb2RlbCBhcmUgZmFpcmx5IGNlbnRyYWwgaW4gdGhlIGxpa2VsaWhvb2Qgc3BhY2UsIHRoZSBmaXQgbG9va3MgdmVyeSBnb29kLgoKYGBge3IsIEJMTywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cgp0YXJnZXRfc2l0ZSA8LSAiQkxPIgoKIyBzdWJzZXQgZGF0YSBmb3IgdGFyZ2V0IHNpdGUKZGF0YSA8LSBhbGxkYXRhICU+JQogIGZpbHRlcihzaXRlID09IHRhcmdldF9zaXRlKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgY29sbGVjdGl2ZSBtb2RlbApwX2JuZHMgPC0gYygwLCAxLjApCmJzX2JuZHMgPC0gYygxLjBlLTEwLCA1KQpicl9ibmRzIDwtIGMoMS4wZS0xMCwgNSkKYXNfYm5kcyA8LSBjKDEuMGUtNSwgNSkKYXJfYm5kcyA8LSBjKDEuMGUtMTAsIDEuNSkKY29sbGVjdGl2ZV9ib3VuZHMgPC0gcmJpbmQoCiAgcF9ibmRzLCBic19ibmRzLAogIGJyX2JuZHMsIGFzX2JuZHMsCiAgYXJfYm5kcwopCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBpbmRpdmlkdWFsIG1vZGVsCmJzX2JuZHMgPC0gYygxLjBlLTYsIDU1MDUpCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAwLjEpCmluZGl2aWR1YWxfYm91bmRzIDwtIHJiaW5kKAogIGJzX2JuZHMsIGFzX2JuZHMKKQoKIyBzZXQgY29vcmRpbmF0ZXMgZm9yIGhpc3RvZ3JhbSBzdWJwbG90CnN1YnBsb3RfY29vcmRzIDwtIGMoMC4yLCA5LjUsIC04LiwgLTIuMikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSA8LSBydW5fd2FnZ2xlZml0X2FuYWx5c2lzKAogIHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzCikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXRfcmVzdWx0ICU+JQogIGtibCgpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0CmBgYAoKCiMjIyBCVVIKCkJzIGFuZCBCciBnbyBpbiBvcG9zaXRlIGRpcmVjdGlvbnMuIEUuZy4gQnMgYXBwcm9hY2hlcyAwIHdoaWxzdCBCciBhcHByb2FjaGVzIGFuIGV2ZXJ5IGhpZ2hlciBudW1iZXIuCgpGaXQgbG9va3MgZ29vZC4KCmBgYHtyLCBCVVIsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKdGFyZ2V0X3NpdGUgPC0gIkJVUiIKCiMgc3Vic2V0IGRhdGEgZm9yIHRhcmdldCBzaXRlCmRhdGEgPC0gYWxsZGF0YSAlPiUKICBmaWx0ZXIoc2l0ZSA9PSB0YXJnZXRfc2l0ZSkKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGNvbGxlY3RpdmUgbW9kZWwKcF9ibmRzIDwtIGMoMCwgMS4wKQpic19ibmRzIDwtIGMoMS4wZS02LCA1MDApCmJyX2JuZHMgPC0gYygxLjBlLTYsIDUwMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKYXJfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKY29sbGVjdGl2ZV9ib3VuZHMgPC0gcmJpbmQoCiAgcF9ibmRzLCBic19ibmRzLAogIGJyX2JuZHMsIGFzX2JuZHMsCiAgYXJfYm5kcwopCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBpbmRpdmlkdWFsIG1vZGVsCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMC4xKQppbmRpdmlkdWFsX2JvdW5kcyA8LSByYmluZCgKICBic19ibmRzLCBhc19ibmRzCikKCiMgc2V0IGNvb3JkaW5hdGVzIGZvciBoaXN0b2dyYW0gc3VicGxvdApzdWJwbG90X2Nvb3JkcyA8LSBjKDAuMSwgNCwgLTYuNSwgLTIuMikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSA8LSBydW5fd2FnZ2xlZml0X2FuYWx5c2lzKAogIHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzCikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXRfcmVzdWx0ICU+JQogIGtibCgpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0CmBgYAoKCiMjIyBDQUQKClRoZSBjb2xsZWN0aXZlIG1vZGVsIHJvdWdobHkgZm9sbG93cyB0aGUgaW5kaXZpZHVhbCBtb2RlbCBidXQgaXMgYWJsZSB0byBhY2hlaXZlIGEgc2xpZ2h0bHkgaW1wcm92ZWQgZml0IHRvIHRoZSBzaG91bGRlciwgaGVuY2UgaXQgcHJvdmlkZXMgYSBoaWdoZXIgbGlrZWxpaG9vZCBzY29yZS4gVGhlIEFJQyBpbmRpY2F0ZXMgdGhpcyBpcyBvdmVyZml0dGluZywgc3VnZ2VzdGluZyB0aGUgaW5kaXZpZHVhbCBtb2RlbCBwcm92aWRlcyBhIG1vcmUgcGFyc2ltb25pb3VzIGV4cGxhbmF0aW9uLgoKJHAkIGRvZXMgbm90IGFwcHJvYWNoIDEgYXMgb25lIG1pZ2h0IGV4cGVjdCwgaW5kaWNhdGluZyB0aGVyZSBpcyBvdmVyZml0dGluZyBhbmQgc28gYSBjb21wYXJpc29uIHdpdGggYW4gaW5kaXZpZHVhbCBtb2RlbCBpcyByZXF1aXJlZC4KCmBgYHtyLCBDQUQsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKdGFyZ2V0X3NpdGUgPC0gIkNBRCIKCiMgc3Vic2V0IGRhdGEgZm9yIHRhcmdldCBzaXRlCmRhdGEgPC0gYWxsZGF0YSAlPiUKICBmaWx0ZXIoc2l0ZSA9PSB0YXJnZXRfc2l0ZSkKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGNvbGxlY3RpdmUgbW9kZWwKcF9ibmRzIDwtIGMoMCwgMS4wKQpic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYnJfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxMCkKYXJfYm5kcyA8LSBjKDEuMGUtMTIsIDEwKQpjb2xsZWN0aXZlX2JvdW5kcyA8LSByYmluZCgKICBwX2JuZHMsIGJzX2JuZHMsCiAgYnJfYm5kcywgYXNfYm5kcywKICBhcl9ibmRzCikKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGluZGl2aWR1YWwgbW9kZWwKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMikKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDAuOCkKaW5kaXZpZHVhbF9ib3VuZHMgPC0gcmJpbmQoCiAgYnNfYm5kcywgYXNfYm5kcwopCgojIHNldCBjb29yZGluYXRlcyBmb3IgaGlzdG9ncmFtIHN1YnBsb3QKc3VicGxvdF9jb29yZHMgPC0gYygwLjEsIDEuOCwgLTYsIC0xLjIpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0gPC0gcnVuX3dhZ2dsZWZpdF9hbmFseXNpcygKICB0YXJnZXRfc2l0ZSwgZGF0YSwgY29sbGVjdGl2ZV9ib3VuZHMsIGluZGl2aWR1YWxfYm91bmRzLCBzdWJwbG90X2Nvb3JkcwopCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0X3Jlc3VsdCAlPiUKICBrYmwoKSAlPiUKICBrYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBGKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdApgYGAKCgojIyMgR0lMCgpUaGUgY29sbGVjdGl2ZSBtb2RlbCBwcm92aWRlcyB0aGUgbW9zdCBwYXJzaW1vbmlvdXMgYW5kIGJlc3QgZml0LgoKYGBge3IsIEdJTCwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cgp0YXJnZXRfc2l0ZSA8LSAiR0lMIgoKIyBzdWJzZXQgZGF0YSBmb3IgdGFyZ2V0IHNpdGUKZGF0YSA8LSBhbGxkYXRhICU+JQogIGZpbHRlcihzaXRlID09IHRhcmdldF9zaXRlKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgY29sbGVjdGl2ZSBtb2RlbApwX2JuZHMgPC0gYygwLCAxLjApCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQpicl9ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKYXJfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKY29sbGVjdGl2ZV9ib3VuZHMgPC0gcmJpbmQoCiAgcF9ibmRzLCBic19ibmRzLAogIGJyX2JuZHMsIGFzX2JuZHMsCiAgYXJfYm5kcwopCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBpbmRpdmlkdWFsIG1vZGVsCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMC44KQppbmRpdmlkdWFsX2JvdW5kcyA8LSByYmluZCgKICBic19ibmRzLCBhc19ibmRzCikKCiMgc2V0IGNvb3JkaW5hdGVzIGZvciBoaXN0b2dyYW0gc3VicGxvdApzdWJwbG90X2Nvb3JkcyA8LSBjKDAuMSwgMi4xLCAtOC4sIC0yKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgoKIyMjIEhFUgoKVGhlIGNvbGxlY3RpdmUgbW9kZWwgcHJvdmlkZXMgdGhlIGJlc3QgZml0IHRvIHRoZSBkYXRhLCBidXQgdGhlIHByb3BvcnRpb24gb2Ygc2NvdXRzIGlzIGhpZ2guCgpgYGB7ciwgSEVSLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnRhcmdldF9zaXRlIDwtICJIRVIiCgojIHN1YnNldCBkYXRhIGZvciB0YXJnZXQgc2l0ZQpkYXRhIDwtIGFsbGRhdGEgJT4lCiAgZmlsdGVyKHNpdGUgPT0gdGFyZ2V0X3NpdGUpCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBjb2xsZWN0aXZlIG1vZGVsCnBfYm5kcyA8LSBjKDAsIDEuMCkKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTAwKQpicl9ibmRzIDwtIGMoMS4wZS02LCAxMDApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjUpCmFyX2JuZHMgPC0gYygxLjBlLTEyLCAxLjUpCmNvbGxlY3RpdmVfYm91bmRzIDwtIHJiaW5kKAogIHBfYm5kcywgYnNfYm5kcywKICBicl9ibmRzLCBhc19ibmRzLAogIGFyX2JuZHMKKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgaW5kaXZpZHVhbCBtb2RlbApic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDIpCmluZGl2aWR1YWxfYm91bmRzIDwtIHJiaW5kKAogIGJzX2JuZHMsIGFzX2JuZHMKKQoKIyBzZXQgY29vcmRpbmF0ZXMgZm9yIGhpc3RvZ3JhbSBzdWJwbG90CnN1YnBsb3RfY29vcmRzIDwtIGMoMC4xLCA0LCAtNi41LCAtMS41KQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgoKIyMjIEhIUwoKQ29sbGVjdGl2ZSBtb2RlbCBwcm92aWRlcyB0aGUgYmVzdCBmaXQgYnV0IGZhbGxzIHVuZGVyIHRoZSB0YWlsIGFuZCBzaG91bGRlci4gVGhlIGluZGl2aWR1YWwgbW9kZWwgc3RydWdsZXMgdG8gZmluZCBhIGdvb2QgZml0LCBwcm9iYWJseSBkdWUgdG8gdGhlIHRhaWwuCgpgYGB7ciwgSEhTLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnRhcmdldF9zaXRlIDwtICJISFMiCgojIHN1YnNldCBkYXRhIGZvciB0YXJnZXQgc2l0ZQpkYXRhIDwtIGFsbGRhdGEgJT4lCiAgZmlsdGVyKHNpdGUgPT0gdGFyZ2V0X3NpdGUpCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBjb2xsZWN0aXZlIG1vZGVsCnBfYm5kcyA8LSBjKDAsIDEuMCkKYnNfYm5kcyA8LSBjKDEuMGUtNiwgNTApCmJyX2JuZHMgPC0gYygxLjBlLTYsIDUwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS41KQphcl9ibmRzIDwtIGMoMS4wZS0xMiwgMS41KQpjb2xsZWN0aXZlX2JvdW5kcyA8LSByYmluZCgKICBwX2JuZHMsIGJzX2JuZHMsCiAgYnJfYm5kcywgYXNfYm5kcywKICBhcl9ibmRzCikKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGluZGl2aWR1YWwgbW9kZWwKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjEpCmluZGl2aWR1YWxfYm91bmRzIDwtIHJiaW5kKAogIGJzX2JuZHMsIGFzX2JuZHMKKQoKIyBzZXQgY29vcmRpbmF0ZXMgZm9yIGhpc3RvZ3JhbSBzdWJwbG90CnN1YnBsb3RfY29vcmRzIDwtIGMoMC4xLCA0LCAtNi41LCAtMi4yKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgoKIyMjIEhPUgoKQ29sbGVjdGl2ZSBtb2RlbCBwcm92aWRlcyBhIHZlcnkgZ29vZCBmaXQsIHdoaWxzdCB0aGUgaW5kaXZpZHVhbCBtb2RlbCBmYWlscyB0byBmaW5kIG11Y2ggdHJhY3Rpb24uIFRoZSBwcm9wb3J0aW9uIG9mIHNjb3V0cyBnb2VzIHZlcnkgbG93ICh+MyUpIHN1Z2dlc3RpbmcgdGhlIG1ham9yaXR5IG9mIHRoZSBjb2xvbnkgYXJlIGZvbGxvd2luZyBhIHNtYWxsIG51bWJlciBvZiBzY291dGluZyBpbmRpdmlkdWFscy4KCmBgYHtyLCBIT1IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKdGFyZ2V0X3NpdGUgPC0gIkhPUiIKCiMgc3Vic2V0IGRhdGEgZm9yIHRhcmdldCBzaXRlCmRhdGEgPC0gYWxsZGF0YSAlPiUKICBmaWx0ZXIoc2l0ZSA9PSB0YXJnZXRfc2l0ZSkKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGNvbGxlY3RpdmUgbW9kZWwKcF9ibmRzIDwtIGMoMCwgMS4wKQpic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYnJfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjUpCmFyX2JuZHMgPC0gYygxLjBlLTEyLCAxLjUpCmNvbGxlY3RpdmVfYm91bmRzIDwtIHJiaW5kKAogIHBfYm5kcywgYnNfYm5kcywKICBicl9ibmRzLCBhc19ibmRzLAogIGFyX2JuZHMKKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgaW5kaXZpZHVhbCBtb2RlbApic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuMSkKaW5kaXZpZHVhbF9ib3VuZHMgPC0gcmJpbmQoCiAgYnNfYm5kcywgYXNfYm5kcwopCgojIHNldCBjb29yZGluYXRlcyBmb3IgaGlzdG9ncmFtIHN1YnBsb3QKc3VicGxvdF9jb29yZHMgPC0gYygwLjEsIDMsIC05LCAtMi41KQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgoKIyMjIE1BSwoKQWdhaW4gdGhlIGNvbGxlY3RpdmUgbW9kZWwgcHJvdmlkZXMgYSBnb29kIGZpdCB0byB0aGUgZGF0YSwgaG93ZXZlciwgdGhlIGluZGl2aWR1YWwgbW9kZWwgZml0cyBwb29ybHksIHJlZHVjaW5nIHRvIGFuIGV4cG9uZW50aWFsLgoKYGBge3IsIE1BSywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cgp0YXJnZXRfc2l0ZSA8LSAiTUFLIgoKIyBzdWJzZXQgZGF0YSBmb3IgdGFyZ2V0IHNpdGUKZGF0YSA8LSBhbGxkYXRhICU+JQogIGZpbHRlcihzaXRlID09IHRhcmdldF9zaXRlKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgY29sbGVjdGl2ZSBtb2RlbApwX2JuZHMgPC0gYygwLCAxLjApCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQpicl9ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKYXJfYm5kcyA8LSBjKDEuMGUtMTIsIDAuNSkKY29sbGVjdGl2ZV9ib3VuZHMgPC0gcmJpbmQoCiAgcF9ibmRzLCBic19ibmRzLAogIGJyX2JuZHMsIGFzX2JuZHMsCiAgYXJfYm5kcwopCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBpbmRpdmlkdWFsIG1vZGVsCmJzX2JuZHMgPC0gYygxLjBlLTYsIDIwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS4xKQppbmRpdmlkdWFsX2JvdW5kcyA8LSByYmluZCgKICBic19ibmRzLCBhc19ibmRzCikKCiMgcnVuIGluZGl2aWR1YWwgbW9kZWwKaW5kaXZpZHVhbF9yZXN1bHQgPC0gZml0X2luZGl2aWR1YWxfbW9kZWxfdG9fZGF0YShkYXRhLCBib3VuZHMpCgojIHZpZXcgaW5kaXZpZHVhbCBtb2RlbCBsaWtlbGlob29kIHNwYWNlIHRvIGNoZWNrIGJvdW5kcyBsb29rIG9rCmluZGl2aWR1YWxfcmVzdWx0JGxsc3BhY2UKCiMgc2V0IGNvb3JkaW5hdGVzIGZvciBoaXN0b2dyYW0gc3VicGxvdApzdWJwbG90X2Nvb3JkcyA8LSBjKDAuMSwgNC4yLCAtNi41LCAtMi41KQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgoKIyMjIE1FTAoKQ29sbGVjdGl2ZSBtb2RlbCBwcm92aWRlcyB0aGUgYmVzdCBmaXQsIGhvd2V2ZXIgaXQgbWlzc2VzIGEgbGFyZ2Ugc2VjdGlvbiBvZiB0aGUgc2hvdWxkZXIgZm9yIHRoZSB0YWlsLiBUaGUgJGJzJCBwYXJhbWV0ZXIgd2FudHMgdG8gZ28gdG8gemVybywgaG93ZXZlciB3aGVuIGxldCBnbyBiZWxsb3cgMWUtNiB0aGUgYmVoYXZpb3VyIGJlY29tZXMgdmVyeSBlcnJhdGljIGFuZCB0aGUgZml0IGRldGVyaW9yYXRlcy4KCmBgYHtyLCBNRUwsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKdGFyZ2V0X3NpdGUgPC0gIk1FTCIKCiMgc3Vic2V0IGRhdGEgZm9yIHRhcmdldCBzaXRlCmRhdGEgPC0gYWxsZGF0YSAlPiUKICBmaWx0ZXIoc2l0ZSA9PSB0YXJnZXRfc2l0ZSkKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGNvbGxlY3RpdmUgbW9kZWwKcF9ibmRzIDwtIGMoMCwgMS4wKQpic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYnJfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjUpCmFyX2JuZHMgPC0gYygxLjBlLTEyLCAwLjUpCmNvbGxlY3RpdmVfYm91bmRzIDwtIHJiaW5kKAogIHBfYm5kcywgYnNfYm5kcywKICBicl9ibmRzLCBhc19ibmRzLAogIGFyX2JuZHMKKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgaW5kaXZpZHVhbCBtb2RlbApic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuMSkKaW5kaXZpZHVhbF9ib3VuZHMgPC0gcmJpbmQoCiAgYnNfYm5kcywgYXNfYm5kcwopCgojIHNldCBjb29yZGluYXRlcyBmb3IgaGlzdG9ncmFtIHN1YnBsb3QKc3VicGxvdF9jb29yZHMgPC0gYygwLjEsIDMuLCAtNywgLTIuMSkKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSA8LSBydW5fd2FnZ2xlZml0X2FuYWx5c2lzKAogIHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzCikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXRfcmVzdWx0ICU+JQogIGtibCgpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0CmBgYAoKCiMjIyBNUEEKCkNvbGxlY3RpdmUgcHJvdmlkZXMgdGhlIGJlc3QgZml0LgoKYGBge3IsIE1QQSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cgp0YXJnZXRfc2l0ZSA8LSAiTVBBIgoKIyBzdWJzZXQgZGF0YSBmb3IgdGFyZ2V0IHNpdGUKZGF0YSA8LSBhbGxkYXRhICU+JQogIGZpbHRlcihzaXRlID09IHRhcmdldF9zaXRlKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgY29sbGVjdGl2ZSBtb2RlbApwX2JuZHMgPC0gYygwLCAxLjApCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQpicl9ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKYXJfYm5kcyA8LSBjKDEuMGUtMTIsIDAuNSkKY29sbGVjdGl2ZV9ib3VuZHMgPC0gcmJpbmQoCiAgcF9ibmRzLCBic19ibmRzLAogIGJyX2JuZHMsIGFzX2JuZHMsCiAgYXJfYm5kcwopCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBpbmRpdmlkdWFsIG1vZGVsCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS4xKQppbmRpdmlkdWFsX2JvdW5kcyA8LSByYmluZCgKICBic19ibmRzLCBhc19ibmRzCikKCiMgc2V0IGNvb3JkaW5hdGVzIGZvciBoaXN0b2dyYW0gc3VicGxvdApzdWJwbG90X2Nvb3JkcyA8LSBjKDAuMSwgNC4sIC03LjIsIC0yLjEpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0gPC0gcnVuX3dhZ2dsZWZpdF9hbmFseXNpcygKICB0YXJnZXRfc2l0ZSwgZGF0YSwgY29sbGVjdGl2ZV9ib3VuZHMsIGluZGl2aWR1YWxfYm91bmRzLCBzdWJwbG90X2Nvb3JkcwopCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0X3Jlc3VsdCAlPiUKICBrYmwoKSAlPiUKICBrYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBGKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdApgYGAKCiMjIyBST1QKCkNvbGxldGl2ZSBwcm92aWRlcyB0aGUgYmVzdCBmaXQuCgpgYGB7ciwgUk9ULCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnRhcmdldF9zaXRlIDwtICJST1QiCgojIHN1YnNldCBkYXRhIGZvciB0YXJnZXQgc2l0ZQpkYXRhIDwtIGFsbGRhdGEgJT4lCiAgZmlsdGVyKHNpdGUgPT0gdGFyZ2V0X3NpdGUpCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBjb2xsZWN0aXZlIG1vZGVsCnBfYm5kcyA8LSBjKDAsIDEuMCkKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmJyX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS41KQphcl9ibmRzIDwtIGMoMS4wZS0xMiwgMC41KQpjb2xsZWN0aXZlX2JvdW5kcyA8LSByYmluZCgKICBwX2JuZHMsIGJzX2JuZHMsCiAgYnJfYm5kcywgYXNfYm5kcywKICBhcl9ibmRzCikKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGluZGl2aWR1YWwgbW9kZWwKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjEpCmluZGl2aWR1YWxfYm91bmRzIDwtIHJiaW5kKAogIGJzX2JuZHMsIGFzX2JuZHMKKQoKIyBzZXQgY29vcmRpbmF0ZXMgZm9yIGhpc3RvZ3JhbSBzdWJwbG90CnN1YnBsb3RfY29vcmRzIDwtIGMoMC4xLCAyLiwgLTUuNSwgLTIuMSkKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSA8LSBydW5fd2FnZ2xlZml0X2FuYWx5c2lzKAogIHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzCikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXRfcmVzdWx0ICU+JQogIGtibCgpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0CmBgYAoKCiMjIyBTQVUKCkNvbGxlY3RpdmUgcHJvdmlkZXMgdGhlIGJlc3QgZml0LgoKYGBge3IsIFNBVSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cgp0YXJnZXRfc2l0ZSA8LSAiU0FVIgoKIyBzdWJzZXQgZGF0YSBmb3IgdGFyZ2V0IHNpdGUKZGF0YSA8LSBhbGxkYXRhICU+JQogIGZpbHRlcihzaXRlID09IHRhcmdldF9zaXRlKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgY29sbGVjdGl2ZSBtb2RlbApwX2JuZHMgPC0gYygwLCAxLjApCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQpicl9ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuNSkKYXJfYm5kcyA8LSBjKDEuMGUtMTIsIDAuNSkKY29sbGVjdGl2ZV9ib3VuZHMgPC0gcmJpbmQoCiAgcF9ibmRzLCBic19ibmRzLAogIGJyX2JuZHMsIGFzX2JuZHMsCiAgYXJfYm5kcwopCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBpbmRpdmlkdWFsIG1vZGVsCmJzX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS4xKQppbmRpdmlkdWFsX2JvdW5kcyA8LSByYmluZCgKICBic19ibmRzLCBhc19ibmRzCikKCiMgc2V0IGNvb3JkaW5hdGVzIGZvciBoaXN0b2dyYW0gc3VicGxvdApzdWJwbG90X2Nvb3JkcyA8LSBjKDAuMSwgMi41LCAtNi41LCAtMi4xKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgojIyMgU09NCgpDb2xsZWN0aXZlIHByb3ZpZGVzIHRoZSBiZXN0IGZpdCBidXQgbWlzc2VzIGEgbGFyZ2Ugc2VjdGlvbiBvZiB0aGUgc2hvdWxkZXIuCgpgYGB7ciwgU09NLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnRhcmdldF9zaXRlIDwtICJTT00iCgojIHN1YnNldCBkYXRhIGZvciB0YXJnZXQgc2l0ZQpkYXRhIDwtIGFsbGRhdGEgJT4lCiAgZmlsdGVyKHNpdGUgPT0gdGFyZ2V0X3NpdGUpICU+JQogIGZpbHRlcihmb3JhZ2luZ19kaXN0YW5jZSA8IDYpICMgcmVtb3ZlIG91dGxpZXIgZGlzdGFuY2UKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGNvbGxlY3RpdmUgbW9kZWwKcF9ibmRzIDwtIGMoMCwgMS4wKQpic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYnJfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjUpCmFyX2JuZHMgPC0gYygxLjBlLTEyLCAwLjUpCmNvbGxlY3RpdmVfYm91bmRzIDwtIHJiaW5kKAogIHBfYm5kcywgYnNfYm5kcywKICBicl9ibmRzLCBhc19ibmRzLAogIGFyX2JuZHMKKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgaW5kaXZpZHVhbCBtb2RlbApic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuMSkKaW5kaXZpZHVhbF9ib3VuZHMgPC0gcmJpbmQoCiAgYnNfYm5kcywgYXNfYm5kcwopCgojIHNldCBjb29yZGluYXRlcyBmb3IgaGlzdG9ncmFtIHN1YnBsb3QKc3VicGxvdF9jb29yZHMgPC0gYygwLjEsIDIuLCAtNS41LCAtMi4xKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgojIyMgU1JBCgpDb2xsZWN0aXZlIHByb3ZpZGVzIHRoZSBiZXN0IGZpdC4KCmBgYHtyLCBTUkEsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKdGFyZ2V0X3NpdGUgPC0gIlNSQSIKCiMgc3Vic2V0IGRhdGEgZm9yIHRhcmdldCBzaXRlCmRhdGEgPC0gYWxsZGF0YSAlPiUKICBmaWx0ZXIoc2l0ZSA9PSB0YXJnZXRfc2l0ZSkKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGNvbGxlY3RpdmUgbW9kZWwKcF9ibmRzIDwtIGMoMCwgMS4wKQpic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYnJfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjUpCmFyX2JuZHMgPC0gYygxLjBlLTEyLCAwLjUpCmNvbGxlY3RpdmVfYm91bmRzIDwtIHJiaW5kKAogIHBfYm5kcywgYnNfYm5kcywKICBicl9ibmRzLCBhc19ibmRzLAogIGFyX2JuZHMKKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgaW5kaXZpZHVhbCBtb2RlbApic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuMSkKaW5kaXZpZHVhbF9ib3VuZHMgPC0gcmJpbmQoCiAgYnNfYm5kcywgYXNfYm5kcwopCgojIHNldCBjb29yZGluYXRlcyBmb3IgaGlzdG9ncmFtIHN1YnBsb3QKc3VicGxvdF9jb29yZHMgPC0gYygwLjEsIDMuLCAtNy41LCAtMi4xKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgojIyMgU1RVCgpJbmRpdmlkdWFsIHByb3ZpZGVzIHRoZSBiZXN0IGZpdC4gQWdhaW4sIHRoZSBwcm9wb3J0aW9uIG9mIHNjb3V0cyBkb2VzIG5vdCBtb3ZlIHRvd2FyZHMgMS4gSS5lLiB0aGUgY29sbGVjdGl2ZSBtb2RlbCBmYWlscyB0byByZWR1Y2UgdG8gdGhlIGluZGl2aWR1YWwgaW4gdGhlIE1MRSBmaXQuCgpgYGB7ciwgU1RVLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnRhcmdldF9zaXRlIDwtICJTVFUiCgojIHN1YnNldCBkYXRhIGZvciB0YXJnZXQgc2l0ZQpkYXRhIDwtIGFsbGRhdGEgJT4lCiAgZmlsdGVyKHNpdGUgPT0gdGFyZ2V0X3NpdGUpCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBjb2xsZWN0aXZlIG1vZGVsCnBfYm5kcyA8LSBjKDAsIDEuMCkKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmJyX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS41KQphcl9ibmRzIDwtIGMoMS4wZS0xMiwgMC41KQpjb2xsZWN0aXZlX2JvdW5kcyA8LSByYmluZCgKICBwX2JuZHMsIGJzX2JuZHMsCiAgYnJfYm5kcywgYXNfYm5kcywKICBhcl9ibmRzCikKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGluZGl2aWR1YWwgbW9kZWwKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjEpCmluZGl2aWR1YWxfYm91bmRzIDwtIHJiaW5kKAogIGJzX2JuZHMsIGFzX2JuZHMKKQoKIyBzZXQgY29vcmRpbmF0ZXMgZm9yIGhpc3RvZ3JhbSBzdWJwbG90CnN1YnBsb3RfY29vcmRzIDwtIGMoMC4xLCA0LCAtNi41LCAtMS41KQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dIDwtIHJ1bl93YWdnbGVmaXRfYW5hbHlzaXMoCiAgdGFyZ2V0X3NpdGUsIGRhdGEsIGNvbGxlY3RpdmVfYm91bmRzLCBpbmRpdmlkdWFsX2JvdW5kcywgc3VicGxvdF9jb29yZHMKKQoKYWxsX3NpdGVzW1t0YXJnZXRfc2l0ZV1dJGZpdF9yZXN1bHQgJT4lCiAga2JsKCkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXQKYGBgCgojIyMgU1dQCgpDb2xsZWN0aXZlIHByb3ZpZGVzIHRoZSBiZXN0IGZpdC4KCmBgYHtyLCBTV1AsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKdGFyZ2V0X3NpdGUgPC0gIlNXUCIKCiMgc3Vic2V0IGRhdGEgZm9yIHRhcmdldCBzaXRlCmRhdGEgPC0gYWxsZGF0YSAlPiUKICBmaWx0ZXIoc2l0ZSA9PSB0YXJnZXRfc2l0ZSkKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGNvbGxlY3RpdmUgbW9kZWwKcF9ibmRzIDwtIGMoMCwgMS4wKQpic19ibmRzIDwtIGMoMS4wZS02LCAxNSkKYnJfYm5kcyA8LSBjKDEuMGUtNiwgMTUpCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjUpCmFyX2JuZHMgPC0gYygxLjBlLTEyLCAwLjUpCmNvbGxlY3RpdmVfYm91bmRzIDwtIHJiaW5kKAogIHBfYm5kcywgYnNfYm5kcywKICBicl9ibmRzLCBhc19ibmRzLAogIGFyX2JuZHMKKQoKIyBzZXQgdXAgYm91bmRzIGZvciB0aGUgaW5kaXZpZHVhbCBtb2RlbApic19ibmRzIDwtIGMoMS4wZS02LCAxMCkKYXNfYm5kcyA8LSBjKDEuMGUtMTIsIDEuMSkKaW5kaXZpZHVhbF9ib3VuZHMgPC0gcmJpbmQoCiAgYnNfYm5kcywgYXNfYm5kcwopCgojIHNldCBjb29yZGluYXRlcyBmb3IgaGlzdG9ncmFtIHN1YnBsb3QKc3VicGxvdF9jb29yZHMgPC0gYygwLjEsIDIuLCAtNiwgLTEuNSkKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSA8LSBydW5fd2FnZ2xlZml0X2FuYWx5c2lzKAogIHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzCikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXRfcmVzdWx0ICU+JQogIGtibCgpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0CmBgYAoKIyMjIFlBTAoKQ29sbGVjdGl2ZSBwcm92aWRlcyB0aGUgYmVzdCBmaXQuCgpgYGB7ciwgWUFMLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnRhcmdldF9zaXRlIDwtICJZQUwiCgojIHN1YnNldCBkYXRhIGZvciB0YXJnZXQgc2l0ZQpkYXRhIDwtIGFsbGRhdGEgJT4lCiAgZmlsdGVyKHNpdGUgPT0gdGFyZ2V0X3NpdGUpCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBjb2xsZWN0aXZlIG1vZGVsCnBfYm5kcyA8LSBjKDAsIDEuMCkKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmJyX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS41KQphcl9ibmRzIDwtIGMoMS4wZS0xMiwgMC41KQpjb2xsZWN0aXZlX2JvdW5kcyA8LSByYmluZCgKICBwX2JuZHMsIGJzX2JuZHMsCiAgYnJfYm5kcywgYXNfYm5kcywKICBhcl9ibmRzCikKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGluZGl2aWR1YWwgbW9kZWwKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjEpCmluZGl2aWR1YWxfYm91bmRzIDwtIHJiaW5kKAogIGJzX2JuZHMsIGFzX2JuZHMKKQoKIyBzZXQgY29vcmRpbmF0ZXMgZm9yIGhpc3RvZ3JhbSBzdWJwbG90CnN1YnBsb3RfY29vcmRzIDwtIGMoMC4xLCA0LiwgLTgsIC0yLikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSA8LSBydW5fd2FnZ2xlZml0X2FuYWx5c2lzKAogIHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzCikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXRfcmVzdWx0ICU+JQogIGtibCgpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0CmBgYAoKIyMjIFpTTAoKQ29sbGVjdGl2ZSBwcm92aWRlcyB0aGUgYmVzdCBmaXQuCgpgYGB7ciwgWlNMLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCnRhcmdldF9zaXRlIDwtICJaU0wiCgojIHN1YnNldCBkYXRhIGZvciB0YXJnZXQgc2l0ZQpkYXRhIDwtIGFsbGRhdGEgJT4lCiAgZmlsdGVyKHNpdGUgPT0gdGFyZ2V0X3NpdGUpCgojIHNldCB1cCBib3VuZHMgZm9yIHRoZSBjb2xsZWN0aXZlIG1vZGVsCnBfYm5kcyA8LSBjKDAsIDEuMCkKYnNfYm5kcyA8LSBjKDEuMGUtNiwgMTApCmJyX2JuZHMgPC0gYygxLjBlLTYsIDEwKQphc19ibmRzIDwtIGMoMS4wZS0xMiwgMS41KQphcl9ibmRzIDwtIGMoMS4wZS0xMiwgMC41KQpjb2xsZWN0aXZlX2JvdW5kcyA8LSByYmluZCgKICBwX2JuZHMsIGJzX2JuZHMsCiAgYnJfYm5kcywgYXNfYm5kcywKICBhcl9ibmRzCikKCiMgc2V0IHVwIGJvdW5kcyBmb3IgdGhlIGluZGl2aWR1YWwgbW9kZWwKYnNfYm5kcyA8LSBjKDEuMGUtNiwgNTApCmFzX2JuZHMgPC0gYygxLjBlLTEyLCAxLjMpCmluZGl2aWR1YWxfYm91bmRzIDwtIHJiaW5kKAogIGJzX2JuZHMsIGFzX2JuZHMKKQoKIyBzZXQgY29vcmRpbmF0ZXMgZm9yIGhpc3RvZ3JhbSBzdWJwbG90CnN1YnBsb3RfY29vcmRzIDwtIGMoMC4xLCAxLjgsIC04LCAtMikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSA8LSBydW5fd2FnZ2xlZml0X2FuYWx5c2lzKAogIHRhcmdldF9zaXRlLCBkYXRhLCBjb2xsZWN0aXZlX2JvdW5kcywgaW5kaXZpZHVhbF9ib3VuZHMsIHN1YnBsb3RfY29vcmRzCikKCmFsbF9zaXRlc1tbdGFyZ2V0X3NpdGVdXSRmaXRfcmVzdWx0ICU+JQogIGtibCgpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IEYpCgphbGxfc2l0ZXNbW3RhcmdldF9zaXRlXV0kZml0CmBgYAoKIyMgT3ZlcmFsbCBmaW5kaW5ncwoKYGBge3IsIG1ha2UtcGxvdHMsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKIyBncm91cCBhbGwgc2l0ZSByZXN1bHRzIHRvZ2V0aGVyCmRmIDwtIG1hcChhbGxfc2l0ZXMsIDEpICU+JQogIGJpbmRfcm93cygpCgojIHNhdmUgcmVzdWx0cwpzYXZlUkRTKGRmLCBmaWxlID0gInJlc3VsdHMvc2l0ZV9maXRfcmVzdWx0cy5SZGEiKQoKIyBBSUMgcGxvdAphaWNfcGxvdCA8LSBkZiAlPiUKICBncm91cF9ieShzaXRlKSAlPiUKICBzbGljZSh3aGljaC5taW4oQUlDKSkgJT4lCiAgc2VsZWN0KG1vZGVsKSAlPiUKICBncm91cF9ieShtb2RlbCkgJT4lCiAgc3VtbWFyaXNlKGxvd2VzdF9BSUMgPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IG1vZGVsLCB5ID0gbG93ZXN0X0FJQykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGxhYnMoeCA9ICJNb2RlbCIsIHkgPSAiQ291bnQiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMCwgYnkgPSAyKSkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNDIpCiAgKQoKZ2dzYXZlKAogIHBsb3QgPSBhaWNfcGxvdCwKICBmaWxlbmFtZSA9ICJyZXN1bHRzL2ZpZ3VyZXMvQUlDX3Bsb3QucG5nIiwKICB3aWR0aCA9IDkwLAogIGhlaWdodCA9IDExMCwKICB1bml0cyA9ICJtbSIsCiAgZHBpID0gMzAwCikKCiMga3MgcGxvdAprc19wbG90X2Rpc3QgPC0gZGYgJT4lCiAgZ2dwbG90KGFlcyh4ID0ga3NfcHZhbHVlKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMCwgYmlud2lkdGggPSAwLjEsIGNvbCA9ICJ3aGl0ZSIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjA1LCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMiwgYnkgPSAyKSkgKwogIGxhYnMoeCA9ICJLUyBQIHZhbHVlIikgKwogIGZhY2V0X3dyYXAofm1vZGVsLCBucm93ID0gMykgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNDIpLAogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQogICkKCgpnZ3NhdmUoCiAgcGxvdCA9IGtzX3Bsb3RfZGlzdCwKICBmaWxlbmFtZSA9ICJyZXN1bHRzL2ZpZ3VyZXMvc2l0ZXNfa3MucG5nIiwKICB3aWR0aCA9IDg2LAogIGhlaWdodCA9IDE4MCwKICB1bml0cyA9ICJtbSIsCiAgZHBpID0gMzAwCikKCmdnc2F2ZSgKICBwbG90ID0gYWxsX3NpdGVzJFNUVSRmaXQsCiAgZmlsZW5hbWUgPSAicmVzdWx0cy9maWd1cmVzL1NUVS5wbmciLAogIHdpZHRoID0gOTAsCiAgaGVpZ2h0ID0gMTEwLAogIHVuaXRzID0gIm1tIiwKICBkcGkgPSAzMDAKKQoKZ2dzYXZlKAogIHBsb3QgPSBhbGxfc2l0ZXMkWlNMJGZpdCwKICBmaWxlbmFtZSA9ICJyZXN1bHRzL2ZpZ3VyZXMvWlNMLnBuZyIsCiAgd2lkdGggPSA5MCwKICBoZWlnaHQgPSAxMTAsCiAgdW5pdHMgPSAibW0iLAogIGRwaSA9IDMwMAopCmBgYAoKCiMjIyBNYXAgcGxvdHMKCgpDb2RlIHRvIG1ha2UgdGhlIGluZGl2aWR1YWwgbWFsIHBsb3RzLiBUaGVzZSBmaWd1cmVzIGFyZSBjcmVhdGVkIHN0YW5kYWxvbmUgYnV0IGFyZSBjb21iaW5lZCBpbiB0byBmYWNldHMgbWFudWFsbHkgaW4gYW4gaW1hZ2UgcHJvY2Vzc29yLgoKYGBge3IsIG1hcC1wbG90cywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoZ2dzbikKbGlicmFyeShzZikKbGlicmFyeShyd29ybGRtYXApCmxpYnJhcnkoZ2dzcGF0aWFsKQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpCgoKZnVsbF9kYXRhX3BhdGggPC0gImRhdGEvRnVsbEhCRm9yYWdpbmdEYXRhLmNzdiIKZGF0YV9yYXcgPC0gdGliYmxlKHJlYWQuY3N2KGZ1bGxfZGF0YV9wYXRoKSkKCm1hcF9kYXRhIDwtIGRhdGFfcmF3ICU+JQogIHNlbGVjdCgKICAgIHNpdGUsIGxhdCwgbG9uCiAgKSAlPiUKICBkaXN0aW5jdCgpCgptYXBfZGF0YSA8LSBkZiAlPiUKICBncm91cF9ieShzaXRlKSAlPiUKICBzbGljZSh3aGljaC5taW4oQUlDKSkgJT4lCiAgc2VsZWN0KHNpdGUsIG1vZGVsKSAlPiUKICBsZWZ0X2pvaW4obWFwX2RhdGEsIG9uID0gInNpdGUiKSAlPiUKICBtdXRhdGUoY29sID0gaWZlbHNlKHNpdGUgJWluJSBjKCJTVFUiLCAiWlNMIiksICIxIiwgIjAiKSkKCmxvY2F0aW9ucyA8LSBzdF9hc19zZigKICBtYXBfZGF0YSwKICBjb29yZHMgPSBjKCJsb24iLCAibGF0IiksIGNycyA9IDQzMjYKKQoKIyBFeHRyYWN0IHNlbGVjdGVkIHNpdGVzIGZvciBmaWd1cmUKc2VsZWN0ZWRfc2l0ZXMgPC0gZmlsdGVyKG1hcF9kYXRhLCBzaXRlICVpbiUgYygiU1RVIiwgIlpTTCIpKSAlPiUKICBtdXRhdGUoCiAgICBsYWJlbCA9IGlmZWxzZShzaXRlID09ICJTVFUiLCAiQyAoU1RVKSIsICJEIChaU0wpIikKICApCgpwb2ludHNfYXJlYSA8LSBzdF9iYm94KGxvY2F0aW9ucykKCndvcmxkbWFwIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJsYXJnZSIsIHJldHVybmNsYXNzID0gInNmIikKCiMgbG9uZG9uIGFyZWEKbG9uZG9uIDwtIHN0X3JlYWQoCiAgInNoYXBlZmlsZXMvTG9uZG9uX1dhcmQuc2hwIgopCgpsb25kb24gPC0gc3RfdHJhbnNmb3JtKAogIGxvbmRvbiwKICBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0ICtub19kZWZzICtlbGxwcz1XR1M4NCArdG93Z3M4ND0wLDAsMCIpCikKCmluc2V0IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHdvcmxkbWFwLAogICAgZmlsbCA9ICJncmV5OTAiLAogICAgY29sb3IgPSAiIzRiNDk0OWQwIgogICkgKwogIGdlb21fc2YoCiAgICBkYXRhID0gbG9uZG9uLAogICAgZmlsbCA9ICIjY2VkMGNmZmMiLAogICAgbHdkID0gMAogICkgKwogIGNvb3JkX3NmKAogICAgeGxpbSA9IGMocG9pbnRzX2FyZWFbWzFdXSAtIDAuMSwgcG9pbnRzX2FyZWFbWzNdXSArIDAuMSksCiAgICB5bGltID0gYyhwb2ludHNfYXJlYVtbMl1dIC0gMC4xLCBwb2ludHNfYXJlYVtbNF1dICsgMC4xKQogICkgKwogIGdlb21fcG9pbnQoCiAgICBkYXRhID0gbWFwX2RhdGEsCiAgICBhZXMoeCA9IGxvbiwgeSA9IGxhdCwgc2hhcGUgPSBtb2RlbCwgY29sb3VyID0gbW9kZWwpLCBzaXplID0gMS41CiAgKSArCiAgZ2VvbV90ZXh0KAogICAgZGF0YSA9IHNlbGVjdGVkX3NpdGVzLCBhZXMoeCA9IGxvbiwgeSA9IGxhdCwgbGFiZWwgPSBsYWJlbCksCiAgICBudWRnZV94ID0gYygwLCAtMC4wNyksIG51ZGdlX3kgPSBjKDAuMDUsIDAuMDUpLCBzaXplID0gOAogICkgKwogIGFubm90YXRpb25fbm9ydGhfYXJyb3coCiAgICBsb2NhdGlvbiA9ICJ0ciIsIHdoaWNoX25vcnRoID0gInRydWUiLAogICAgc3R5bGUgPSBub3J0aF9hcnJvd19mYW5jeV9vcmllbnRlZXJpbmcsCiAgICBoZWlnaHQgPSB1bml0KDE1LCAibW0iKSwKICAgIHdpZHRoID0gdW5pdCgxNSwgIm1tIiksCiAgICB0ZXh0X2NleCA9IDEuNQogICkgKwogIGFubm90YXRpb25fc2NhbGUoCiAgICBsb2NhdGlvbiA9ICJiciIsCiAgICB0ZXh0X2NleCA9IDEuNQogICkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDEsIDIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICJyZWQiKSkgKwogIHRoZW1lX25vdGhpbmcoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArCiAgdGhlbWUoCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPSAuNSkKICApCgppbnNldAoKIyBtYWtlIGZ1bGwgcGxvdApiYXNlIDwtIGdncGxvdChkYXRhID0gd29ybGRtYXApICsKICBnZW9tX3NmKAogICAgZmlsbCA9ICIjYzRjZmM4IiwKICAgIGNvbG9yID0gIiM0YjQ5NDlkMCIsCiAgICBsd2QgPSAwLjIKICApICsKICBjb29yZF9zZigKICAgIHhsaW0gPSBjKC0xMSwgMyksCiAgICB5bGltID0gYyg0OS41LCA2MCkKICApICsKICAjIGdlb21fcG9pbnQoZGF0YSA9IG1hcF9kYXRhLCBhZXMoeCA9IGxvbiwgeSA9IGxhdCksIHNpemUgPSAwLjIpICsKICBnZW9tX3JlY3QoCiAgICBhZXMoCiAgICAgIHhtaW4gPSBwb2ludHNfYXJlYSR4bWluW1sxXV0gLSAwLjEsIHhtYXggPSBwb2ludHNfYXJlYSR4bWF4W1sxXV0gKyAwLjEsCiAgICAgIHltaW4gPSBwb2ludHNfYXJlYSR5bWluW1sxXV0gLSAwLjEsIHltYXggPSBwb2ludHNfYXJlYSR5bWF4W1sxXV0gKyAwLjEKICAgICksCiAgICBmaWxsID0gTkEsCiAgICBjb2xvdXIgPSAiYmxhY2siLAogICAgc2l6ZSA9IC4wMgogICkgKwogIHRoZW1lX25vdGhpbmcoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArCiAgdGhlbWUoCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPSAuNSkKICApCgpiYXNlCgptZXJnZV9wbG90IDwtIGJhc2UgKwogIGFubm90YXRpb25fY3VzdG9tKAogICAgZ2dwbG90R3JvYihpbnNldCksCiAgICB4bWluID0gMSwKICAgIHhtYXggPSAxMywKICAgIHltaW4gPSA1Mi41LAogICAgeW1heCA9IDYwCiAgKQoKbWVyZ2VfcGxvdAoKZ2dzYXZlKAogIHBsb3QgPSBtZXJnZV9wbG90LAogIGZpbGVuYW1lID0gInJlc3VsdHMvZmlndXJlcy9zaXRlX21hcC5wbmciLAogIHdpZHRoID0gOTAsCiAgaGVpZ2h0ID0gMTEwLAogIHVuaXRzID0gIm1tIiwKICBkcGkgPSAzMDAKKQoKCm1lcmdlX3Bsb3RfMiA8LSBpbnNldCArCiAgYW5ub3RhdGlvbl9jdXN0b20oCiAgICBnZ3Bsb3RHcm9iKGJhc2UpLAogICAgeG1pbiA9IC0zLjM1LAogICAgeG1heCA9IDIsCiAgICB5bWluID0gNTEuMDUsCiAgICB5bWF4ID0gNTEuMzUKICApCgptZXJnZV9wbG90XzIKCnNpdGVzX21vZGVsX3Bsb3QgPC0gcGxvdF9ncmlkKAogIG1lcmdlX3Bsb3RfMiwga3NfcGxvdF9kaXN0LCBhbGxfc2l0ZXMkU1RVJGZpdCwgYWxsX3NpdGVzJFpTTCRmaXQsCiAgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIpLCBsYWJlbF9zaXplID0gMjQKKQoKZ2dzYXZlKAogIHBsb3QgPSBzaXRlc19tb2RlbF9wbG90LAogIGZpbGVuYW1lID0gInJlc3VsdHMvZmlndXJlcy9zaXRlc19tb2RlbF9wbG90LnBuZyIsCiAgd2lkdGggPSAxODMsCiAgaGVpZ2h0ID0gMTkwLAogIHVuaXRzID0gIm1tIiwKICBkcGkgPSAzMDAKKQoKbW9kZWxfc2l0ZXNfZml0cyA8LSBwbG90X2dyaWQoCiAgbWVyZ2VfcGxvdF8yLCBrc19wbG90X2Rpc3QsCiAgbGFiZWxzID0gYygiQSIsICJCIiksIGxhYmVsX3NpemUgPSAyNAopCgpnZ3NhdmUoCiAgcGxvdCA9IG1vZGVsX3NpdGVzX2ZpdHMsCiAgZmlsZW5hbWUgPSAicmVzdWx0cy9maWd1cmVzL21vZGVsX3NpdGVzX2ZpdHMucG5nIiwKICB3aWR0aCA9IDE4MywKICBoZWlnaHQgPSAxOTAsCiAgdW5pdHMgPSAibW0iLAogIGRwaSA9IDMwMAopCgpzdHVfenNsX2ZpdCA8LSBwbG90X2dyaWQoCiAgYWxsX3NpdGVzJFNUVSRmaXQsIGFsbF9zaXRlcyRaU0wkZml0LAogIGxhYmVscyA9IGMoIkEiLCAiQiIpLCBsYWJlbF9zaXplID0gMjQKKQoKZ2dzYXZlKAogIHBsb3QgPSBzdHVfenNsX2ZpdCwKICBmaWxlbmFtZSA9ICJyZXN1bHRzL2ZpZ3VyZXMvc3R1X3pzbF9maXQuc3ZnIiwKICB3aWR0aCA9IDE4MywKICBoZWlnaHQgPSAxOTAsCiAgdW5pdHMgPSAibW0iLAogIGRwaSA9IDEwMAopCgpgYGAKCgpgYGB7ciwgZXZhbCA9IEZBTFNFLCBvdGhlci1tYXAtcGxvdHMsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQojIG90aGVyIG1hcCBwbG90cwppbnNldCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSB3b3JsZG1hcCwKICAgIGZpbGwgPSAiZ3JleTkwIiwKICAgIGNvbG9yID0gIiM0YjQ5NDlkMCIKICApICsKICBnZW9tX3NmKAogICAgZGF0YSA9IGxvbmRvbiwKICAgIGZpbGwgPSAiI2NlZDBjZmZjIiwKICAgIGx3ZCA9IDAKICApICsKICBjb29yZF9zZigKICAgIHhsaW0gPSBjKHBvaW50c19hcmVhW1sxXV0gLSAwLjEsIHBvaW50c19hcmVhW1szXV0gKyAwLjEpLAogICAgeWxpbSA9IGMocG9pbnRzX2FyZWFbWzJdXSAtIDAuMSwgcG9pbnRzX2FyZWFbWzRdXSArIDAuMSkKICApICsKICBnZW9tX3BvaW50KAogICAgZGF0YSA9IG1hcF9kYXRhLAogICAgYWVzKHggPSBsb24sIHkgPSBsYXQsIHNoYXBlID0gbW9kZWwsIGNvbG91ciA9IG1vZGVsKSwgc2l6ZSA9IDEuNQogICkgKwogIGFubm90YXRpb25fbm9ydGhfYXJyb3coCiAgICBsb2NhdGlvbiA9ICJ0ciIsIHdoaWNoX25vcnRoID0gInRydWUiLAogICAgc3R5bGUgPSBub3J0aF9hcnJvd19mYW5jeV9vcmllbnRlZXJpbmcsCiAgICBoZWlnaHQgPSB1bml0KDEwLCAibW0iKSwKICAgIHdpZHRoID0gdW5pdCgxMCwgIm1tIikKICApICsKICBhbm5vdGF0aW9uX3NjYWxlKAogICAgbG9jYXRpb24gPSAiYnIiLAogICAgdGV4dF9jZXggPSAzCiAgKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMSwgMikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgInJlZCIpKSArCiAgdGhlbWVfbm90aGluZygpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsKICB0aGVtZSgKICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2l6ZSA9IC41KSwKICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQyKQogICkKCmluc2V0CgojIG1ha2UgZnVsbCBwbG90CmJhc2UgPC0gZ2dwbG90KGRhdGEgPSB3b3JsZG1hcCkgKwogIGdlb21fc2YoCiAgICBmaWxsID0gIiNjNGNmYzgiLAogICAgY29sb3IgPSAiIzRiNDk0OWQwIiwKICAgIGx3ZCA9IDAuMgogICkgKwogIGNvb3JkX3NmKAogICAgeGxpbSA9IGMoLTExLCAxNSksCiAgICB5bGltID0gYyg0OS41LCA2MCkKICApICsKICBnZW9tX3BvaW50KGRhdGEgPSBtYXBfZGF0YSwgYWVzKHggPSBsb24sIHkgPSBsYXQpLCBzaXplID0gMC4yKSArCiAgZ2VvbV9yZWN0KAogICAgYWVzKAogICAgICB4bWluID0gcG9pbnRzX2FyZWEkeG1pbltbMV1dIC0gMC4xLCB4bWF4ID0gcG9pbnRzX2FyZWEkeG1heFtbMV1dICsgMC4xLAogICAgICB5bWluID0gcG9pbnRzX2FyZWEkeW1pbltbMV1dIC0gMC4xLCB5bWF4ID0gcG9pbnRzX2FyZWEkeW1heFtbMV1dICsgMC4xCiAgICApLAogICAgZmlsbCA9IE5BLAogICAgY29sb3VyID0gImJsYWNrIiwKICAgIHNpemUgPSAuMDIKICApICsKICB0aGVtZV9ub3RoaW5nKCkgKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwogIHRoZW1lKAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIiwgZmlsbCA9IE5BLCBzaXplID0gLjUpCiAgKQoKbWVyZ2VfcGxvdCA8LSBiYXNlICsKICBhbm5vdGF0aW9uX2N1c3RvbSgKICAgIGdncGxvdEdyb2IoaW5zZXQpLAogICAgeG1pbiA9IDEsCiAgICB4bWF4ID0gMTMsCiAgICB5bWluID0gNTIuNSwKICAgIHltYXggPSA2MAogICkKCm1lcmdlX3Bsb3QKCmdnc2F2ZSgKICBwbG90ID0gbWVyZ2VfcGxvdCwKICBmaWxlbmFtZSA9ICJyZXN1bHRzL2ZpZ3VyZXMvc2l0ZV9tYXAucG5nIiwKICB3aWR0aCA9IDE4MywKICBoZWlnaHQgPSAxOTAsCiAgdW5pdHMgPSAibW0iLAogIGRwaSA9IDMwMAopCgoKc2l0ZXNfbW9kZWxfcGxvdCA8LSBwbG90X2dyaWQoCiAgYWxsX3NpdGVzJFNUVSRmaXQsIGFsbF9zaXRlcyRaU0wkZml0LCBhaWNfcGxvdCwga3NfcGxvdF9kaXN0LAogIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIiwgIkQiKSwgbGFiZWxfc2l6ZSA9IDQyCikKCnNpdGVzX21vZGVsX3Bsb3QKCmdnc2F2ZSgKICBwbG90ID0gc2l0ZXNfbW9kZWxfcGxvdCwKICBmaWxlbmFtZSA9ICJyZXN1bHRzL2ZpZ3VyZXMvcmVzdWx0c19tb2RlbF9wbG90LnBuZyIsCiAgd2lkdGggPSAxODMsCiAgaGVpZ2h0ID0gMTkwLAogIHVuaXRzID0gIm1tIiwKICBkcGkgPSAzMDAKKQpgYGAK